package com.yeban.javase.day02.test05;

/**
 * @Desc TODO
 * @Author yeban
 * @Date 2025/10/10
 * <p>
 * 1、定义一个英雄类Hero，可以通过这个类创建英雄角色
 * 属性：
 * 游戏角色拥有昵称name，等级level，血量blood，攻击力power，防御力defence，种族kind，
 * 装备Equip（只能装3个装备，初始没有装备）。
 * 方法：
 * 游戏角色拥有基本攻击方法（拥有一定几率打出暴击）attack(Monster m)，死亡判定方法isDead()，添加装备的方法addEquip(Equip e)，获取角色信息的方法show()。
 * 暴击>某个值
 * 失血量=(攻击+暴击)-防御
 */
public class Hero {

    private String name;        // 昵称
    private int level;          // 等级
    private double blood;          // 血量
    private int power;        // 攻击力
    private int defence;        // 防御力
    private String kind;        // 种族
    private Equip[] equip;
    private int index;

    public Hero() {
        this.equip = new Equip[3]; // 固定3个装备栏
        this.index = 0;
    }

    public Hero(String name, int level, int blood, int power, int defence, String kind) {
        this.name = name;
        this.level = level;
        this.blood = blood;
        this.power = power;
        this.defence = defence;
        this.kind = kind;
        this.equip = new Equip[3]; // 固定3个装备栏
        this.index = 0;
    }

    public void attack(Monster m) { // 基本攻击方法（拥有一定几率打出暴击）
        int totalPower = this.power;

        for (int i = 0; i < index; i++) {
            totalPower += equip[i].getPower();
        }

        int damage = totalPower - m.getDefence();
        if(damage <= 0) {
            damage = 1;
        }
        if(Math.random() > 0.5) {   // 一般概率
            m.setBlood(m.getBlood() - damage * 1.25);
            System.out.println("【" + this.name + "】" + "对" + "【" + m.getName() +"】" + "造成了" + damage*1.25 + "点伤害");
            System.out.println("此次攻击进行了暴击！");
        } else {
            m.setBlood(m.getBlood() - damage);
            System.out.println("【" + this.name + "】" + "对" + "【" + m.getName() +"】" + "造成了" + damage + "点伤害");
        }

        if(m.getBlood() <= 0) {
            System.out.println("【" + m.getName() +"】" + "还有" + 0 + "滴血\n");
        } else {
            System.out.println("【" + m.getName() +"】" + "还有" + m.getBlood() + "滴血\n");
        }
    }

    public boolean isDead() {  // 死亡判定方法
        if(blood <= 0) {
            System.out.println("【" + this.name + "】"+"英雄阵亡！");
            return true;
        }
        return false;
    }

    public void addEquip(Equip e) { // 添加装备的方法
        if(index >= equip.length) {
            System.out.println("装备栏已满！无法装备【" + e.getName() + "】");
            return;
        }
        equip[index++] = e;
        power += e.getPower();          // 攻击力+装备附加
        defence += e.getDefence();      // 防御力+装备附加
    }

    public void show() { // 获取角色信息的方法
        System.out.println(this);
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return level
     */
    public int getLevel() {
        return level;
    }

    /**
     * 设置
     * @param level
     */
    public void setLevel(int level) {
        this.level = level;
    }

    /**
     * 获取
     * @return blood
     */
    public double getBlood() {
        return blood;
    }

    /**
     * 设置
     * @param blood
     */
    public void setBlood(double blood) {
        this.blood = blood;
    }

    /**
     * 获取
     * @return power
     */
    public int getPower() {
        return power;
    }

    /**
     * 设置
     * @param power
     */
    public void setPower(int power) {
        this.power = power;
    }

    /**
     * 获取
     * @return defence
     */
    public int getDefence() {
        return defence;
    }

    /**
     * 设置
     * @param defence
     */
    public void setDefence(int defence) {
        this.defence = defence;
    }

    /**
     * 获取
     * @return kind
     */
    public String getKind() {
        return kind;
    }

    /**
     * 设置
     * @param kind
     */
    public void setKind(String kind) {
        this.kind = kind;
    }

    /**
     * 获取
     * @return equip
     */
    public Equip[] getEquip() {
        return equip;
    }

    /**
     * 设置
     * @param equip
     */
    public void setEquip(Equip[] equip) {
        this.equip = equip;
    }

    /**
     * 获取
     * @return index
     */
    public int getIndex() {
        return index;
    }

    /**
     * 设置
     * @param index
     */
    public void setIndex(int index) {
        this.index = index;
    }

    public String toString() {
        return "Hero{name = " + name + ", level = " + level + ", blood = " + blood + ", power = " + power + ", defence = " + defence + ", kind = " + kind + ", equip = " + equip + ", index = " + index + "}";
    }
}
